/*
 * Copyright 2009 eBusinessInformation
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.excilys.ymca.activity;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

import com.excilys.ymca.R;
import com.excilys.ymca.command.Command;
import com.excilys.ymca.command.impl.AddContactCommand;
import com.excilys.ymca.command.impl.DialPhoneNumberCommand;
import com.excilys.ymca.command.impl.SendMailCommand;
import com.excilys.ymca.command.impl.ShowAddressCommand;
import com.excilys.ymca.model.Contact;
import com.excilys.ymca.view.ContactSimpleAdapterBuilderAndCommandInvoker;

/**
 * Activité listant les détails d'un contact, avec des actions associées.
 * 
 * @author Pierre-Yves Ricau ( py.ricau+ymca @ gmail.com )
 * 
 */
public class ContactDetailsActivity extends Activity {

	/**
	 * Nom du paramètre sérialisé transmis par l'activité précédente.
	 */
	public final static String								CONTACT_EXTRA		= "contact";

	/**
	 * Contact dont les détails sont affichés.
	 */
	private Contact											contact;

	/**
	 * Vue contenant la liste des actions / détails du contact.
	 */
	private ListView										actionListView;

	/**
	 * Builder permettant de construire l'adapter de actionListView.
	 */
	private ContactSimpleAdapterBuilderAndCommandInvoker	builderAndInvoker	= new ContactSimpleAdapterBuilderAndCommandInvoker(this);

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		/*
		 * L'appel à la méthode parente est obligatoire.
		 */
		super.onCreate(savedInstanceState);

		/*
		 * Les vues contenues dans le layout donné en paramètre sont créées.
		 */
		setContentView(R.layout.contact_details);

		retrieveData();
		findViews();
		addContent();
		addListeners();

	}

	/**
	 * Récupération des données métier
	 */
	private void retrieveData() {
		/*
		 * Récupération de l'entité sérialisée envoyée en paramètre par
		 * l'activité précédente.
		 */
		contact = (Contact) getIntent().getSerializableExtra(CONTACT_EXTRA);
	}

	/**
	 * Récupère les vues à partir de leur identifiant, et les place dans des
	 * variable d'instance.
	 */
	private void findViews() {
		actionListView = (ListView) findViewById(R.id.action_list);
	}

	/**
	 * Ajoute du contenu aux vues
	 */
	private void addContent() {

		/*
		 * Définition du titre de l'activité
		 */
		setTitle(contact.getName());

		/*
		 * Ajout de trois actions dans le builder : appeler, voir sur google
		 * map, ajouter à l'annuaire. On utilise des variables locales afin que
		 * le code soit plus clair ;-) .
		 */

		String title;
		String content;
		Command command;

		// Composer un numéro de téléphone
		title = getString(R.string.contact_details_call_text);
		content = contact.getPhoneNumber();
		command = new DialPhoneNumberCommand(this, contact.getPhoneNumber());
		builderAndInvoker.addAction(title, content, command);

		// Voir une adresse sur Google Maps
		title = getString(R.string.contact_details_map_text);
		content = contact.getAddress();
		command = new ShowAddressCommand(this, contact.getAddress());
		builderAndInvoker.addAction(title, content, command);

		// Ajouter un contact à l'annuaire
		title = getString(R.string.contact_details_add_text);
		content = getString(R.string.contact_details_add_details);
		command = new AddContactCommand(this, contact);
		builderAndInvoker.addAction(title, content, command);

		// Envoyer un email au contact
		title = getString(R.string.contact_details_email_text);
		content = contact.getEmailAddress();
		command = new SendMailCommand(this, contact.getEmailAddress());
		builderAndInvoker.addAction(title, content, command);

		/*
		 * Libre à vous d'ajouter vos propres actions ici !
		 */

		SimpleAdapter adapter = builderAndInvoker.build();

		actionListView.setAdapter(adapter);
	}

	/**
	 * Ajoute des listeners aux composants graphiques pour réagir aux actions de
	 * l'utilisateur.
	 */
	private void addListeners() {
		actionListView.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
				builderAndInvoker.execute(position);
			}
		});
	}

}
